home *** CD-ROM | disk | FTP | other *** search
- PAGE ,132
- TITLE Quadratic Equation roots
- IF1
- INCLUDE 87MAC.LIB
- ENDIF
- ZZZ SEGMENT STACK
- DW 64 DUP(?)
- ZZZ ENDS
- CODE SEGMENT PUBLIC
- ASSUME CS:CODE,DS:CODE,ES:CODE
- EXTRN FLOAT_ASCII:NEAR
- A DW 1
- B DW -5
- C DW 6
- STATUS DW ?
- FOUR DW 4
- TWO DW 2
- ERROR_MSG DB 'Roots are imaginary',10,13,'$'
- QUADRATIC PROC FAR
- PUSH DS
- SUB AX,AX
- PUSH AX
- MOV AX,CS
- MOV DS,AX
- MOV ES,AX
- DO_AGAIN:
- FINIT ;------ST0------;-----ST1-------
- FILD B ; B ;
- FMUL ST0 ; B**2 ;
- FILD A ; A ; B**2
- FIMUL FOUR ; 4*A ; B**2
- FIMUL C ; 4*A*C ; B**2
- FSUBRP ST1,ST0 ; D=B**2-4AC ; ?
- FTST ;
- FSTSW STATUS
- MOV AH,BYTE PTR STATUS+1
- SAHF
- JB IMAGINARY
- FSQRT ; SQR(D) ;
- FLD ST0 ; SQR(D) ; SQR(D)
- FCHS ; -SQR(D) ; SQR(D)
- FIADD B ; B-SQR(D) ; SQR(D)
- FCHS ; -B+SQR(D) ; SQR(D)
- FXCH ST1 ; SQR(D) ; -B+SQR(D)
- FIADD B ; B+SQR(D) ; -B+SQR(D)
- FCHS ;N1= -B-SQR(D) ;N2= -B+SQR(D)
- FIDIV A ; N1/A ; N2
- FIDIV TWO ; ROOT1 =N1/2A ; N2
- CALL FLOAT_ASCII ; N2
- FIDIV A ; N2/A ;
- FIDIV TWO ; ROOT2 = N2/2A ;
- CALL FLOAT_ASCII ; ? ;
- RET
- IMAGINARY:
- MOV DX,OFFSET ERROR_MSG
- MOV AH,9
- INT 21H
- RET
- QUADRATIC ENDP
- CODE ENDS
- END QUADRATIC
-